package rauguelu.programaEventos;

import java.io.StringReader;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import rauguelu.items.Prevision;
import rauguelu.items.ReporteTiempo;
import rauguelu.items.TiempoActual;

public class LectorTiempo {

	private String xml;
	private Document doc;
	private ReporteTiempo reporteTiempo;
	
	public LectorTiempo(String xml) throws Exception
	{
		DocumentBuilderFactory factory1 = DocumentBuilderFactory
                .newInstance();
        factory1.setNamespaceAware(true); // never forget this!
        InputSource source = new InputSource(new StringReader(xml));
        doc = factory1.newDocumentBuilder().parse(source);
        doc.getDocumentElement().normalize();
	}
	public ReporteTiempo damePrevisiones()
	{
        NodeList nodeLst = doc.getElementsByTagName("weather");

        reporteTiempo = new ReporteTiempo();
        for (int s = 0; s < nodeLst.getLength(); s++) {
            Node wehther = nodeLst.item(s);

            if (wehther.getNodeType() == Node.ELEMENT_NODE) {

            	NodeList hijosWeather = (NodeList) wehther.getChildNodes();
            	
            	  for (int i = 0; i < hijosWeather.getLength(); i++) {
            		  Node condition = hijosWeather.item(i);
            		  if(condition.getNodeName().equals("forecast_information"))
            		  {
            			  leeInformacionGeneral(condition);
            		  }
            		  else if(condition.getNodeName().equals("current_conditions"))
            		  {
            			  leeCondicionesActuales(condition);
            		  }
            		  else if(condition.getNodeName().equals("forecast_conditions"))
            		  {
            			  leePrevisiones(condition);
            			  for (int j = 0; j < hijosWeather.getLength(); j++)
            			  {
            				  Node propiedad = hijosWeather.item(i);
            				  if(propiedad.getNodeName().equals("day_of_week"))
            				  {
            				  }
            			  }
            		  }
            	  }
            }
            
        }
        return  reporteTiempo;
	}
	private void leeInformacionGeneral(Node elemento)
	{
		NodeList propiedades = elemento.getChildNodes();
		for (int i = 0; i < propiedades.getLength(); i++)
		  {
			  Node propiedad = propiedades.item(i);
			  if(propiedad.getNodeName().equals("city"))
			  {
				  reporteTiempo.setCiudad(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("postal_code"))
			  {
				  reporteTiempo.setCodigoPostal(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("latitude_e6"))
			  {
				  reporteTiempo.setLatitude(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("longitude_e6"))
			  {
				  reporteTiempo.setLongitude(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
			  else if(propiedad.getNodeName().equals("forecast_date"))
			  {
				  reporteTiempo.setDate(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
			  else if(propiedad.getNodeName().equals("current_date_time"))
			  {
				  reporteTiempo.setDateTime(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
		  }
	}
	
	private void leeCondicionesActuales(Node elemento)
	{
		TiempoActual tiempoActual = new TiempoActual();
		NodeList propiedades = elemento.getChildNodes();
		for (int i = 0; i < propiedades.getLength(); i++)
		  {
			  Node propiedad = propiedades.item(i);
			  if(propiedad.getNodeName().equals("condition"))
			  {
				  tiempoActual.setSituacion(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("temp_f"))
			  {
				  tiempoActual.setTemperaturaFaren(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("temp_c"))
			  {
				  tiempoActual.setTemperaturaCent(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("humidity"))
			  {
				  tiempoActual.setHumedad(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
			  else if(propiedad.getNodeName().equals("icon"))
			  {
				  tiempoActual.setRutaImagen(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
			  else if(propiedad.getNodeName().equals("wind_condition"))
			  {
				  tiempoActual.setSituacionViento(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
		  }
		reporteTiempo.setActual(tiempoActual);
	}
	
	private void leePrevisiones(Node elemento)
	{
		Prevision prevision = new Prevision();
		
		NodeList propiedades = elemento.getChildNodes();
		for (int i = 0; i < propiedades.getLength(); i++)
		  {
			  Node propiedad = propiedades.item(i);
			  if(propiedad.getNodeName().equals("day_of_week"))
			  {
				  prevision.setDiaSemana(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("low"))
			  {
				  prevision.setMinima(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("high"))
			  {
				  prevision.setMaxima(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }
			  else if(propiedad.getNodeName().equals("icon"))
			  {
				  prevision.setRutaImagen(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
			  else if(propiedad.getNodeName().equals("condition"))
			  {
				  prevision.setSituacion(propiedad.getAttributes().getNamedItem("data").getNodeValue());
			  }	
		  }
		if(reporteTiempo.getDiasSiguientes()==null)
		{
			reporteTiempo.setDiasSiguientes(new ArrayList<Prevision>());
		}
		reporteTiempo.getDiasSiguientes().add(prevision);
	}
	
}
